<?php
namespace Pinenut\Model2;

/**
 * Класс прендазначен для работы с агрегацией монги.
 * пока реализована только группировка с операцией сумирования по полю.
 */
class Aggregator extends Finder {
	
	/*
	 * TO DO
	 * Допилить заполнение монго полей в самом адаптере.
	 * Попробовать сделать более мнеее абстрактно.
	 */
	public $pipeline = [];
	public $ops = [];
	public $groupFields = [];


	/**
	 * Функция определяет с какими полями бд мы будем работать.
	 * принимает стринг с именем поля.
	 *
	 * TODO: дурь это, есть fields(), нужно отрефакторить и везде в проектах поменять
	 *
	 * @param $field
	 * @return $this
	 */
	function project($field){
		$this->fields[$field] = 1;
		return $this;
		
	}

	/**
	 * функия устанавливает группировку по полю. Поле должно быть выбрано в функции project.
	 *
	 * TODO: всякие там доллары нужно устанавливать уже в адаптере, а тут чистые данные должны быть!
	 *
	 * @param $fieldInDB
	 * @param null $fieldName
	 * @return $this
	 */
	function groupBy($fieldInDB, $fieldName=null){
		if(null === $fieldName){
			$fieldName = $fieldInDB;
		}

		$this->project($fieldInDB);
		$this->groupFields[$fieldName] = "$".$fieldInDB;
		return $this;
	}

	/**
	 * Функция устанавливает операцию суммирования по одинаковым полям.
	 *
	 * TODO: эти две функции тоже нафиг переименовать
	 * @param $fieldOutput
	 * @return $this
	 */
	function count($fieldOutput){
		$fieldsOn = ['$sum' => 1];
		$this->ops[$fieldOutput] = $fieldsOn;
		return $this;
	}
	
	/*function sum($fieldsOutput,$fieldsInDB){
		$fieldsOn = array('$sum'=>$fieldsInDB);
		$this->ops[$fieldOutput] = $fieldsOn;
		return $this;
	}*/

	/**
	 * Добавляем условие
	 *
	 * @param $field
	 * @param $value
	 * @param null $op
	 * @return Finder
	 */
	function match($field, $value, $op = null) {
		return $this->where($field, $value, $op); // для совместимости до рефакторинга;
	}


	/**
	 * Функция которая возвращает результат из монги.
	 * @return array|null
	 */
	function aggregate() {
		$class = $this->class;
		$raw = $class::fetch($this);
		
		$raw = reset ( $raw );
		if (empty ( $raw ))
			return null;
		
		return $raw;
	}

	/**
	 * @return array
	 */
	function getOperators() {
		return $this->ops;
	}

	/**
	 * @return array
	 */
	function getGroupBy() {
		return $this->groupFields;
	}
}